前言
也算是使用了ElasticSearch
一段时间了,但是还是没有仔细看过Lucene
相关的内容。今天来系统小结下。
这篇文章主要谈论Lucene
的基本架构,倒排索引
,分词器
,如何使用查询语法查询Lucene
以及Lucene
和ElasticSearch
的区别和联系。
Lucene
基本架构
- 文档:索引和搜索的主要的数据载体,包含多个字段。
- 字段:多个字段组成一个文档。包含具体的信息。
- 词项:由
term
翻译而来。可以简单理解为具体的信息中拆分出来的一个个单词。 - 词条:由
token
翻译而来。词项在文本中的一次出现。不仅包含词项的内容,而且包含开始的位置,结束的位置等信息。 - 段:由
Segment
翻译而来。每个段只会被创建一次,段一但被创建了之后就不会被修改。所以,会存在段合并的过程,减少段的数量,而且搜索的性能也会提升。段中数据的删除只会在段合并的过程中进行。
term和token的区别是什么?
举个例子,有下面一段文本。My brother love ElasticSearch.I love ElasticSearch,too.
token为My,brother,love,ElasticSearch,I,love,ElasticSearch,too
term为My,brother,love,ElasticSearch,I,too
倒排索引
简单来说,倒排索引最主要的一个特点是面向term
建立索引的,而不是面向文档
建立索引的。
举个例子,假如有下面这几个文档。
doc1:I love ElasticSearch
doc2:I love Java
doc3:I hate sleeping
如果使用传统面向文档的方式建立索引,那么当使用love
进行搜索的时候,需要先遍历doc1中所有的字段,再遍历doc2中所有的字段,依次遍历,直到最后一个doc,才能够确定存在love
这个单词的文档是doc1,doc2
。
如果使用的是倒排索引呢?
那么会组成以下的倒排索引。
Term | Doc |
---|---|
I | doc1,doc2,doc3 |
love | doc1,doc2 |
elasticsearch | doc1 |
java | doc2 |
sleeping | doc3 |
那么,当使用love
来搜索的时候,最多只需要遍历一遍就能够查询到结果。直接返回doc1,doc2
。优势在于只要匹配到了term
,就可以直接返回。无需像传统索引一样遍历所有的文档。
分词器
一段文本在Lucene
中被转化为一个一个可用于搜索的词项的过程叫做分析。有时候也会叫做分词。在Lucene
中是使用分词器来进行分析(分词)的行为的。
举个例子
I love ElasticSearch -> [I,love,elasticsearch]
这里就是原来的文本被分词器转换为多个词项。
文本分析由分析器执行,而分析器又由字符过滤器,分词器和字符映射器组成。
那么这三个组成又分别有什么作用呢?
举个例子。存在下面这样文本。
I love! ElasticSearch.
经过了字符过滤器之后
I love! ElasticSearch. -> I lvoe ElasticSearch
字符过滤器是去掉在原本文本中存在的一些不合适
的字符,比如!
,.
等。过滤器将原本存在多种不合适
的字符流转化为合适
的字符流。
接着,会经过分词器。
I love ElasticSearch -> [I,love,ElasticSearch]
分词器会原来的字符流转化为多个词项的数组。最终可以通过这些词项搜索。
[I,love,ElasticSearch] -> [I,love,elasticsearch]
最后,字符映射器会将最原始的词项统一格式,比如都转化为小写的词项。这个被转化后的词项才会被Lucene
存放。
当然,这是默认的标准分析器采用的规则。不同的分析器可以使用不同的字符过滤器,分词器和字符映射器来完成分析的工作。
查询语法
由查询内容和操作符组合而成。
Lucene与ElasticSearch的联系
首先,ElasticSearch
正是基于Lucene
开发的。相对于Lucene
拥有轻量级,独立性的特点来说。ElasticSearch
具有的特点就是分布式,可扩展,高可用的特点。
关于写作
以后这里每天都会写一篇文章,题材不限,内容不限,字数不限。尽量把自己每天的思考都放入其中。
如果这篇文章给你带来了一些帮助,可以动动手指点个赞,顺便关注一波就更好了。
如果上面都没有,那么写下读完之后最想说的话?有效的反馈和你的鼓励是对我最大的帮助。
另外打算把博客给重新捡起来了。欢迎大家来访问吃西瓜。
我是shane。今天是2019年9月6日。百天写作计划的第四十四天,44/100。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。